package com.ArrayQueue;
/**
1.0：使用数组模拟队列
rear = front = -1 ，front表示队列头前一个位置，rear表示最后一个元素的位置
判空条件：rear = front
判满条件：rear = maxSize - 1
存在缺陷：数组只能用一次，取出元素后，该位置还是不能使用
解决方案：将该数组变成环形队列

 **/
public class ArrayQueue {
    private int maxSize;
    private int front;
    private int rear;
    private int[] arr; //用于存放数据，数组模拟队列

    //创建队列,进行初始化工作
    public ArrayQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //当队列为空时，首尾指针都为-1
        front = -1; //front指向队列头部的前一个位置
        rear = -1; //rear指向队列尾的位置
    }

    //判断队列是否满
    public boolean isFull(){
        return rear == maxSize - 1 ;
    }

    //判断队列是否为空
    public boolean isEmpty(){
        return rear == front ;
    }

    //添加数据到队列
    public void addQueue(int n){
        //添加数据到队列时，首先判断队列是否满
        if(isFull()){
            System.out.println("队列已满，不能加入数据");
            return;
        }
        arr[++rear] = n;
    }

    //获取队列中的数据,出队列
    public int getQueue(){
        //判断队列是否尾空
        if(isEmpty()){
            //通过抛出异常处理
            throw new RuntimeException("队列为空，没有数据获取");
        }
        int n = arr[++ front];
        arr[front] = 0;
        return  n;
    }

    //获取队列中的所有数据
    public void showQueue(){
        //判断对内是否为空
        if(isEmpty()){
            System.out.println("队列为空，没有数据获取");
        }
        //获取数据时，队列内部的首位指针无需移动
        for(int i = front+1;i<=rear;i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    //显示队列的头部数据，不是取数据
    public int getHandData(){
        //判断队列是否尾空
        if(isEmpty()){
            //通过抛出异常处理
            throw new RuntimeException("队列为空，没有数据获取");
        }
        //如果是++front，则改变了front的值，变成了删除队列
        return arr[front+1];
    }

    //查看队首和队尾指针
    public void showRearAndFront(){
        System.out.println("rear = "+rear+", front = "+front);
    }
}
